TimesTenが提供するトランザクション・ログAPI(XLA)によって、アプリケーションではローカル・データ・ストアのトランザクション・ログを監視し、他のアプリケーションで実行された更新を検出できます。また、XLAが提供する関数によって、XLAアプリケーションでは、検出した変更を別のデータ・ストアに適用できます。XLAはC言語のAPIですが、TimesTenでは、個別のJavaラッパー・インタフェースと、TTClasses製品の一部としてXLAのC++ラッパー・インタフェースが提供されます。
アプリケーションでは主にXLAを使用して、変更通知スキームを実装します。このスキームでは、XLAアプリケーションがデータ・ストアに変更がないかどうかを監視し、変更に基づいて対処できます。たとえば、株式取引環境におけるTimesTenデータ・ストアは、株価のデータ・ストリームによって絶えず更新されます。自動取引アプリケーションではXLAを使用して、特定の株価の更新についてデータ・ストアを監視し、その情報に基づいて発注するかどうかを判断します。詳細は、「使用例2: リアルタイム取引価格サービス・アプリケーション」を参照してください。
また、XLAを使用してカスタム・データ・レプリケーション・ソリューションを構築し、TimesTenレプリケーション・サービス(『Oracle TimesTen Replication - TimesTen to TimesTen開発者および管理者ガイド』を参照)のかわりに使用することもできます。このようなXLA対応のレプリケーション・ソリューションには、TimesTen以外のデータベースによるレプリケーションや、別のTimesTenデータ・ストアへの更新の転送が含まれます。
XLAは次のいずれかのモードで動作します。
永続モードの場合、XLAは、更新レコードをトランザクション・ログ・バッファまたはログ・ファイルから直接取得します。レコードがバッファ内に存在しない場合は、図8.1に示すように、ディスク上のログ・ファイルから更新レコードを取得します。
図8.1 永続モードのXLA
非永続モードの場合は、図8.2に示すように、XLAは、トランザクション・ログから更新レコードを取得し、それらをXLAステージング・バッファに移動します。
図8.2 非永続モードのXLA
それぞれのモードにはメリットもデメリットもあります。たとえば、通常、非永続モードは永続モードより高速ですが、ステージング・バッファは一度に1つの読取りアクセスのみが可能であり、バッファから読み込まれたレコードは削除され使用できなくなります。また、データ・ストアが停止されると、バッファ内のすべての更新レコードが失われます。一方、永続モードの場合は、トランザクション・ログの更新に対して同時に複数の読取りアクセスが可能であり、ログ・ファイルが使用可能であるかぎり、ログ・レコードも使用可能です。
永続モードで作業する場合、読取りアクセスはブックマークを使用して、ログ更新ストリームにおける位置を保持します。ブックマークはデータ・ストアに保存されるため、データ・ストアの接続、停止およびクラッシュが発生しても永続的に維持されます。XLAアプリケーションでは、ttXlaGetLSN関数を使用してブックマークの位置を取得できます。また、ttXlaSetLSN関数を使用してブックマークの位置を再設定することで、一連の更新レコードを再度読み取ることができます。
更新レコードを作成したトランザクションをコミットすると、その更新レコードをただちにログから読み取れます。ログ・スニファ・アプリケーションでは、ログに書き込まれた更新レコードのグループをXLA ttXlaNextUpdate関数を使用して取得できます。
返される各レコードには、固定長の更新ヘッダー(ttXlaUpdateDesc_t)と、内部書式に従って保存された1行または2行のデータが含まれます。更新ヘッダーには、更新行が適用される表、そのレコードがトランザクションの最初のレコードかまたは最後(コミット)のレコードか、レコードが表すトランザクション・タイプ、返される行データの長さ、および更新された列(存在する場合)が記述されます。
データの更新を反映するレコードの場合は、2行が返され、更新前と更新後の行データがレポートされます。各行のデータの最初の部分は固定長データで、その後ろに可変長データが続きます。アプリケーションからttXlaGetColumnInfo関数をコールすると、特定の表の列のオフセットとサイズを取得できます。XLAがその表のレコードを返すと、返された行の固定長部分の列は、ttXlaGetColumnInfoで返されたオフセットに格納されます。可変長データの場合、図8.3に示すように、行の固定長部分のオフセットにあるデータは、行の可変長部分の実データの位置の算出に使用されるアドレスです。
図8.3 更新レコードの内容
レコード内の行データは、TimesTenの内部書式に従っています。アプリケーションで列のアドレスを見つけたら、そのアドレスの値を対応するODBC Cデータ型に直接キャストできます。日付、時間、10進値などの複合データ型は、アプリケーションで、XLA変換関数を使用してそれらの対応するODBC C値に変換できます。詳細は、『Oracle TimesTen In-Memory Database C開発者およびリファレンス・ガイド』のXLAとTimesTenイベント管理に関する章の複合データ型の変換の項を参照してください。